package primalgorithms.array;

import java.util.HashSet;

public class _10IsValidSudoku {
    public static boolean isValidSudoku(char[][] board) {
        for(int i = 0;i < 9;i++){
            //每遍历一行元素新建一个哈希表
            HashSet setLine = new HashSet(9);
            HashSet setCol = new HashSet(9);
            HashSet setCell = new HashSet(9);
            for(int j = 0;j < 9;j++){
                //该表达式表示如果元素不为空时，添加元素是否成功
                //成功则表示没有该元素，不成功表示以重复
                //对行检测
                if(board[i][j] != '.' && !setLine.add(board[i][j])){
                    return false;
                }
                if(board[j][i] != '.' && !setCol.add(board[j][i])){
                    return false;
                }
                /**
                 * 重点：0,1,2,3,4,5,6,7,8 数组下标变换
                 * 经过 /3*3 ==> 0,0,0,3,3,3,6,6,6 ==>行起始点
                 * 经过 %3*3 ==> 0,3,6,0,3,6,0,3,6 ==>列起始点
                 */
                //行起始点
                int a = (i/3)*3 + j/3;
                //列起始点
                int b = (i%3)*3 + j%3;
                if(board[a][b] != '.' && !setCell.add(board[a][b])){
                    return false;
                }
            }
        }
        return true;
    }
}
